package jdklearning.concurrent.threadpool;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

/**
 * @author shenenlu 2021年05月12日 上午09:46:23
 */
public class SubmitAndExecute {


    /**
     * 会发现单独使用submit方法的并不会打印出错误日志，而使用execute方法打印出了错误日志
     * ，但是对submit返回的FutureJoinTask调用get()方法，又会抛出异常。
     * 于是真相大白，部分批次中的数据存在脏数据，为null值
     * ，遍历到该null值的时候出现了异常，但是异常日志在submit方法中给catch住
     * ，没有打印出来（心痛的感觉），而被捕获的异常，被包装在返回的结果类FutureJoinTask中
     * ，并没有再次抛出。
     *
     * @param args
     * @throws InterruptedException
     * @throws ExecutionException
     */
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        submitAndExecute();
    }


    public static void submitAndExecute() throws InterruptedException, ExecutionException{
        final ExecutorService pool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(null);
        //1.使用submit
        pool.submit(() -> {
            list.parallelStream().map(Object::toString).collect(Collectors.toList());
        });
        TimeUnit.SECONDS.sleep(3);
        //2.使用 execute
        pool.execute(() -> {
            list.parallelStream().map(Object::toString).collect(Collectors.toList());
        });
        //3.使用submit，调用get()
        pool.submit(() -> {
            list.parallelStream().map(Object::toString).collect(Collectors.toList());
        }).get();
        TimeUnit.SECONDS.sleep(3);
    }

}
